export default class Queue<T>{
    private count:number; //队列大小
    private lowestCount:number; // 记录第一个元素
    private items:any;
    
    constructor(){
        this.count = 0;
        this.lowestCount = 0;
        this.items = {};
    }
    
    /**
     * 向队列中添加一个元素
     * @param element T
     * items是JavaScript对象，它是一个键值对的集合。
     * 我们把count变量作为items对象中的键，对应元素作为值。
     * 加入队列后，我们将count值加1。
     */
    enqueue(element:T){
        this.items[this.count] = element;
        this.count++;
    }
    /**
     * 从队列中移除元素
     * 1.判断队列是否为空，为空则返回undefined。
     * 2.不为空时，先暂存队列头部的值，方便返回。
     * 3.删除队头的值并返回
     */
    dequeue(){
        if(this.isEmpty()){
            return undefined
        }
        const result = this.items[this.lowestCount];
        delete this.items[this.lowestCount];
        this.lowestCount++;
        return result; 
    }
    /**
     * 查看队列头元素
     */
    peek(){
        if(this.isEmpty()){
            return undefined
        }
        return this.items[this.lowestCount];
    }
    /**
     * 检查队列是否为空
     */
    isEmpty(){
        return this.size() === 0;
    }
    /**
     * 清空队列
     */
    clear(){
        this.items = {};
        this.count = 0;
        this.lowestCount = 0;
    }
    /**
     * 获取队列长度
     */
    size(){
        return this.count - this.lowestCount;
    }
    /**
     * toString方法
     */
    toString(){
        if(this.isEmpty()) return "";
        let objString = `${this.items[this.lowestCount]}`;
        for(let i = this.lowestCount;i<this.count;i++){
            objString = `${objString}, ${this.items[i]}`;
        }
        return objString;
    }
}